var express = require('express');
var router = express.Router();
var utils = require('../functions/utils');

// sns apn disable된 애들 삭제한다. (disable되려면 한번보내서 세팅되고 그 담에 또 보내봐야 에러가 떨어지는데 두번째 삭제를 한다면 그 때까지 들고 있어야 하거나 다시는 안보낼 수도 있으므로 스케줄러에서 삭제한다.
router.post('/', function(req,res)
{
	var appId = req.body.appId;	utils.checkParamValue('appId' , appId);

	utils.callLog(req);

	var listEndpointsParams = {  NextToken: null };

	switch(utils.getOSTypeFromAppId(appId))
	{
		case 0:	// ios
			listEndpointsParams.PlatformApplicationArn = global.config.push.snsPlatformArn.iOS;
			break;
		default: // android : 1
			listEndpointsParams.PlatformApplicationArn = global.config.push.snsPlatformArn.android;
	}


	var AWS = require('aws-sdk');
	var async = require('async');
	var setPushDisable = require('../functions/setPushDisable');

	// 있을경우 - 아마존이외에서 콜할 때 
	if(utils.isValidString(global.config.aws_auth.accessKeyId))
	{
		AWS.config.update(
			{	accessKeyId: global.config.aws_auth.accessKeyId
			, secretAccessKey: global.config.aws_auth.secretAccessKey}
		);
	}
	AWS.config.update({	region: global.config.push.region});
	var sns = new AWS.SNS();


/*
{ 
	ResponseMetadata: { RequestId: 'efa2bad8-d95d-52e1-88d0-f7513636ead7' },
  Endpoints:
   [ 
	 { EndpointArn: 'arn:aws:sns:us-west-2:085307523710:endpoint/APNS/IOS_test/9dc2a4be-f1bb-317c-aede-ed2503194b58',
       Attributes: {
		   "Enabled":"true",
		   "Token":"2c672f5b44fd6e9f684f1104d1e6f3a8f9fedf529165a90f9a1c960ff059a8be"} 
		},
     { EndpointArn: 'arn:aws:sns:us-west-2:085307523710:endpoint/APNS/IOS_test/ca622f4d-c0df-3b1f-9b1e-d2b2d2bd9374',
       Attributes: {
		   "Enabled":"false",
		   "Token":"2c672f5b44fd6e9f684f1104d1e6f3a8f9fedf529165a90f9a1c960ff059a8be"} 
	   } 
	] 
}
*/

	// 처음은 list얻어오는거 들어가고 
	var getListCount = 0;
	var delCount = 0;
	async.whilst
	(
		// check function - 처음은 체크스킵 
		function () { return getListCount== 0 || utils.isValidString(listEndpointsParams.NextToken); },
		// operator
		function (getListCB) {

			sns.listEndpointsByPlatformApplication(listEndpointsParams, function(err, listEndpointsData) 
			{
				//에러나면 나감.
				if(err)
				{	
					throw err;
				}

				var endpoints = listEndpointsData.Endpoints;
				
				utils.debug('getList['+getListCount+'] count '+endpoints.length+' , NextToken '+listEndpointsData.NextToken + ' START\n');

				if(endpoints.length > 0)
				{
					// whilest로 개수별로 체크한다. 
					var endpointIndex = 0;
					async.whilst
					(
						function () 
						{ 
							return endpointIndex < endpoints.length; 
						},
						function (endpointCB) 
						{
							var thisEndpoint = endpoints[endpointIndex++];

							// 사용못하는 애들은 지운다 - 스트링인데 나중에 리턴형이 bool로 바뀔 수도 있으므로 parse사용한다.
							if(!JSON.parse(thisEndpoint.Attributes.Enabled))
							{
								// sns arn 삭제하고 pushconfig::pushactivate=0 으로 세팅  callback은 안에서 콜.
								delCount ++;
								setPushDisable(sns , 'EndpointDisabled' ,thisEndpoint.Attributes.Token , thisEndpoint.EndpointArn ,endpointCB); 
							}
							// 사용하는 애는 스킵  
							else
							{
								endpointCB();
							}

						},
						function (err) 
						{
						    utils.debug('----------------------------------------');

							// nexttoken 세팅 
							listEndpointsParams.NextToken = listEndpointsData.NextToken;

							getListCount ++;
							getListCB();
						}
					); //async.whilst

				}	// if(endpoints.length > 0)
				else
				{
					// 하나도 안나왔으니 nexttoken은 널이겠지.
					listEndpointsParams.NextToken = listEndpointsData.NextToken;

					getListCount ++;
					getListCB();
				}
			}); // listEndpointsByPlatformApplication

		},	// operator 

		function (err) {
			var msg = 'total delete count :' + delCount;
			res.end(msg);
			
		    utils.debug(msg);
		}
	); //async.whilst
	
});

module.exports = router;